/********************************************
 *  链栈
 * Created by zlj on 2024/6/26.
********************************************/
#include "LinkStack.h"

/**
 * Initization
 * @param s
 */
void InitLinkStack(LinkStack *s)
{
    *s = NULL;
}

/**
 * 入栈
 * @param s
 * @param x
 */
void LinkStack_Push(LinkStack *s, ElemType x)
{
    StackNode *t = LINK_STACK_LEN;
    assert(t != NULL);
    //将数据存放入栈节点
    t->data = x;
    if (*s == NULL) //如果链栈的结点为空
    {
        *s = t;    //将链栈的指针指向这个结点
        t->next = NULL;
    } else//如果栈里面已经有结点，直接进行头插
    {
        t->next = *s; //将新结点连接上之前的结点
        *s = t; //将栈指针指向最新的栈结点
    }
}

/**
 * 打印
 * @param s
 */
void LinkStack_Show(LinkStack *s)
{
    StackNode *p = *s; //指向栈顶
    while (p != NULL)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");

}

/**
 * 出栈
 * @param s
 */
void LinkStack_Pop(LinkStack *s)
{
    //printf("%p",&s);
    StackNode *p = *s;
    *s = p->next;
    free(p);
    p = NULL;
}

/**
 * 判断是否为空
 * @param s
 * @return
 */
bool LinkStack_IsEmpty(LinkStack *s)
{
    //如果栈顶top的值等于0，则表示栈为空
    if (*s == NULL)
        return TRUE;
    else
        return FALSE;
}

/**
 * 取栈顶元素
 * @param s
 * @param v
 * @return
 */
bool LinkStack_GetTop(LinkStack *s, ElemType *v)
{
    if (LinkStack_IsEmpty(s))
    {
        printf("The stack space is empty and cannot retrieve the top element of the stack. \n");
        return FALSE;
    }
    *v = (*s)->data;
    return TRUE;
}

/**
 * 获取元素个数
 * @param s
 * @return
 */
int LinkStack_Length(LinkStack *s)
{
    int len = 0;
    StackNode *p = *s;
    while (p != NULL)
    {
        p = p->next;
        len++;
    }
    return len;
}

/**
 * 清空
 * @param s
 */
void LinkStack_Clear(LinkStack *s)
{
    while (*s != NULL)
    {
        LinkStack_Pop(s);
    }
}

/**
 * 销毁
 * @param s
 */
void LinkStack_Destory(LinkStack *s)
{
    LinkStack_Clear(s);
}